package graphvizapi;

/*$Id$*/
import java.io.*;

public class GraphViz {

  private static String TEMP_DIR = "";
  private String DOT = "g\\bin\\dot.exe";

  public void setDotExec(String filename) {
    DOT = filename;
  }
  private StringBuffer graph = new StringBuffer();

  public GraphViz() {
  }

  public String getDotSource() {
    return graph.toString();
  }

  public void add(String line) {
    graph.append(line);
  }

  public void addln(String line) {
    graph.append(line + "\n");
  }

  public void addln() {
    graph.append('\n');
  }

  public byte[] getGraph(String dot_source) {
    File dot;
    byte[] img_stream = null;

    try {
      dot = writeDotSourceToFile(dot_source);
      if (dot != null) {
        img_stream = get_img_stream(dot);
        if (dot.delete() == false) {
          System.err.println("Warning: " + dot.getAbsolutePath() + " could not be deleted!");
        }
        return img_stream;
      }
      return img_stream;
    } catch (java.io.IOException ioe) {
      return null;
    }
  }

  public int writeGraphToFile(byte[] img, String file) {
    File to = new File(file);
    return writeGraphToFile(img, to);
  }

  public int writeGraphToFile(byte[] img, File to) {
    try {
      FileOutputStream fos = new FileOutputStream(to);
      if (img == null) {
        System.out.println("no image!");
      }
      fos.write(img);
      fos.close();
    } catch (java.io.IOException ioe) {
      return -1;
    }
    return 1;
  }

  private byte[] get_img_stream(File dot) {
    File img;
    byte[] img_stream = null;

    try {
      img = File.createTempFile("graph_", ".png", new File(this.TEMP_DIR));
      String temp = img.getAbsolutePath();

      Runtime rt = Runtime.getRuntime();
      String cmd = DOT + " -Tpng " + dot.getAbsolutePath() + " -o " + img.getAbsolutePath();
      System.out.println(cmd);
      Process p = rt.exec(cmd);
      p.waitFor();

      FileInputStream in = new FileInputStream(img.getAbsolutePath());
      img_stream = new byte[in.available()];
      in.read(img_stream);
      // Close it if we need to
      if (in != null) {
        in.close();
      }
      if (img.delete() == false) {
        System.err.println("Warning: " + img.getAbsolutePath() + " could not be deleted!");
      }
    } catch (java.io.IOException ioe) {
      System.err.println("Error:    in I/O processing of tempfile in dir " + this.TEMP_DIR + "\n");
      System.err.println("       or in calling external command");
      ioe.printStackTrace();
    } catch (java.lang.InterruptedException ie) {
      System.err.println("Error: the execution of the external program was interrupted");
      ie.printStackTrace();
    }

    return img_stream;
  }

  private File writeDotSourceToFile(String str) throws java.io.IOException {
    File temp;
    try {
      temp = File.createTempFile("graph_", ".dot.tmp", new File(this.TEMP_DIR));
      FileWriter fout = new FileWriter(temp);
      fout.write(str);
      fout.close();
    } catch (Exception e) {
      System.err.println("Error: I/O error while writing the dot source to temp file!");
      return null;
    }
    return temp;
  }

  public String start_graph() {
    return "digraph G {";
  }

  public String end_graph() {
    return "}";
  }
}
